
#include <iostream>
#include <string>
#include <pthread.h>
#include <unistd.h>
#include <vector>
#include <thread>

std::string PrintToHex(pthread_t& tid)
{
    char buffer[64];
    snprintf(buffer, sizeof buffer, "0x%lx", tid);
    return buffer;
}

void threadrun(int num)
{
    while (num)
    {
        std::cout << "thread-1 num: " << num-- << std::endl;
        sleep(1);
    }
}

int main()
{
    std::thread mythread(threadrun, 10);
    while (true)
    {
        std::cout << "main thread..." << std::endl;
        sleep(1);
    }
    mythread.join();
    return 0;
}









// const int num = 10;

// void* threadRun(void* args)
// {
//     std::string name = static_cast<const char *>(args);
//     while (true)
//     {
//         std::cout << name << " is running..." << std::endl;
//         sleep(1);
//         break;
//     }

//     pthread_exit(args); // 终止本线程 
//     // return args;
// }

// int main()
// {
//     std::vector<pthread_t> tids;
//     for (int i = 0; i < num; ++i)
//     {
//         // 线程 ID 
//         pthread_t tid;

//         // 线程名 
//         // char name[128];
//         char* name = new char[128];
//         snprintf(name, 128, "thread-%d", i + 1);
//         pthread_create(&tid, nullptr, threadRun, name);

//         // 保存所有线程的 ID --- base 
//         tids.emplace_back(tid);
//     }

//     for (auto& e : tids)
//     {
//         void* name = nullptr;
//         pthread_join(e, &name);
//         std::cout << static_cast<const char *>(name) << " quit" << std::endl;
//         delete static_cast<const char *>(name);
//     }

//     sleep(100);
//     return 0;
// }













// class ThreadData
// {
// public:
//     ThreadData()
//         :_name("thread-1"), _num("1"), _x(10), _y(20)
//     {}
//     std::string& getName() { return _name; }
//     std::string& getNum() { return _num; }
//     int getX() { return _x; }
//     int getY() { return _y; }
//     int Excute() { return _x + _y; }
// private:
//     std::string _name;
//     std::string _num;
//     int _x;
//     int _y;
// };

// class ThreadResult
// {
// public:
//     ThreadResult(int x = 1, int y = 2, int ret = 100)
//         : _x(x), _y(y), _ret(ret)
//     {}
//     int getX() { return _x; }
//     int getY() { return _y; }
//     int getRet() { return _ret; }
//     void setRet(int ret) { _ret = ret; }
// private:
//     int _x;
//     int _y;
//     int _ret;
// };

// void* threadRun(void* args)
// {
//     ThreadData* td = static_cast<ThreadData*>(args);
//     ThreadResult* result = new ThreadResult();
//     result->setRet(td->Excute());
//     int cnt = 10;
//     while (cnt)
//     {
//         std::cout << td->getName() << " run ... number: " << td->getNum() << ", cnt: " << cnt-- << std::endl;
//         sleep(1); 
//     }
//     delete td;
//     return (void*)result;
// }

// std::string PrintToHex(pthread_t& tid)
// {
//     char buffer[64];
//     snprintf(buffer, sizeof buffer, "0x%lx", tid);
//     return buffer;
// }

// int main()
// {
//     pthread_t tid; // 无符号长整数，线程 ID 
//     ThreadData* td = new ThreadData();
//     // 主线程和新线程谁先运行？不确定，与优先级和线程库有关 
//     int n = pthread_create(&tid, nullptr, threadRun, (void*)td);
//     if (n != 0)
//     {
//         std::cerr << "create thread error" << std::endl;
//         return 1;
//     }

//     std::string tid_str = PrintToHex(tid);
//     std::cout << "tid: " << tid_str << std::endl;

//     // 我们期望 主线程最后退出，join 可以保证（阻塞等待） 
//     std::cout << "main thread join begin..." << std::endl;
//     ThreadResult* result = nullptr;
//     n = pthread_join(tid, (void**)&result);
//     if (n == 0)
//     {
//         std::cout << "main thread wait success, new thread exit code: " << result->getRet() << std::endl;
//     }
//     return 0;
// }
